package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.*;
import pe.edu.upc.karaoke.util.ConexionBD;


public class ProductoDAO extends BaseDAO {
		
	public Producto obtener(int idProducto) throws DAOExcepcion {
		
		Producto producto = new Producto();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query = "SELECT IDPRODUCTO, NOMBRE, PRECIO, DISPONIBLE FROM PRODUCTO WHERE IDPRODUCTO=? AND ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idProducto);
				rs = stmt.executeQuery();
				
				if (rs.next()) {
					producto.setIdProducto(rs.getInt(1));
					producto.setNombre(rs.getString(2));
					producto.setPrecio(rs.getDouble(3));
					producto.setDisponible(rs.getInt(4));
			}
		} catch (SQLException e) {
				producto = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return producto;
	}

	public List<Producto> listarProduto() throws DAOExcepcion {
		
		List<Producto> lista = new ArrayList<Producto>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"SELECT IDPRODUCTO, NOMBRE FROM PRODUCTO WHERE ELOG = 1";
								
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Producto producto  = new Producto();
					producto.setIdProducto(rs.getInt("IDPRODUCTO"));
					producto.setNombre(rs.getString("NOMBRE"));
					
					lista.add(producto);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	public List<Producto> buscarPorNombre(String nombre) throws DAOExcepcion {
		
		List<Producto> lista = new ArrayList<Producto>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"SELECT P.*, T.NOMBRE AS TI_PRODUCTO FROM PRODUCTO P, TIPOPRODUCTO T " +
								"WHERE P.NOMBRE LIKE ? " +
								"AND P.IDTIPOPRODUCTO = T.IDTIPOPRODUCTO " +
								"AND ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Producto producto = new Producto();
					producto.setIdProducto(rs.getInt("IDPRODUCTO"));
					producto.setNombre(rs.getString("NOMBRE"));
					producto.setPrecio(rs.getDouble("PRECIO"));
					producto.setDisponible(rs.getInt("DISPONIBLE"));
					
					TipoProducto tipoProducto = new TipoProducto();
					tipoProducto.setIdTipoProducto(rs.getInt("IDTIPOPRODUCTO"));
					tipoProducto.setNombre(rs.getString("TI_PRODUCTO"));
					
					producto.setTipoProducto(tipoProducto);
					lista.add(producto);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	
	public Producto insertar(Producto producto) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO PRODUCTO (NOMBRE, PRECIO, DISPONIBLE, ELOG, IDTIPOPRODUCTO) " +
								"VALUES (?,?,?,1,?)";
				
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, producto.getNombre());
				stmt.setDouble(2, producto.getPrecio());
				stmt.setInt(3, producto.getDisponible());
				stmt.setInt(4, producto.getTipoProducto().getIdTipoProducto());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				producto.setIdProducto(id);

		} catch (SQLException e) {
				producto = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return producto;
	}

	
	public String eliminar(int idProducto) throws DAOExcepcion {
		
		Producto producto = new Producto();
		Connection con = null;
		PreparedStatement stmt = null;
		
		String vReturn = "NO_OK";
		try {
				String query =	"UPDATE PRODUCTO SET ELOG = 0 " +
								" WHERE IDPRODUCTO=? ";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idProducto);
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ELIMINAR");
				}else{
					vReturn = "OK";
				}
		} catch (SQLException e) {
				producto = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return vReturn;
	}

	
	public Producto actualizar(Producto producto) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
				String query =	"UPDATE PRODUCTO SET NOMBRE=?, PRECIO=?, DISPONIBLE=?, IDTIPOPRODUCTO=? " +
								"WHERE IDPRODUCTO=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, producto.getNombre());
				stmt.setDouble(2, producto.getPrecio());
				stmt.setInt(3, producto.getDisponible());
				stmt.setInt(4, producto.getTipoProducto().getIdTipoProducto());
				stmt.setInt(5, producto.getIdProducto());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ACTUALIZAR");
				}
		} catch (SQLException e) {
				producto = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return producto;
	}
	
}
